/**
 * @file diagnostic.h
 * @author Linquan 
 * @brief   诊断处理
 * @version 0.1
 * @date 2023-6-14
 * 
 * @copyright Copyright (c) 2025
 * 
 */

#ifndef _DIAGNOSTIC_H_
#define _DIAGNOSTIC_H_

#include "stdint.h"
#include "list.h"

#define DIAGNOSIC_PERIOD_MS  10U  //“DiagMainProcess” 函数调用周期

#define T_DETCT_MIN   (-32767-1)    //INT16_MIN
#define T_DETCT_MAX   (32767)       //INT16_MAX
#define T_DETCT_COUNT INT16


/**
 * @brief 诊断标志：用于统一 诊断通过与失败的描述
*/
typedef enum 
{
    FLAG_PASS = 0,
    FLAG_FAIL ,
} ENU_DETCT_FLAG; 


/**
 * @brief 诊断结果
*/
typedef enum DETCT_RESULT
{
    DETCT_FAILED,    //失败
    DETCT_PREFAILED, //预失败
    DETCT_NOTCHECK,  //未检测
    DETCT_PREPASSED, //预通过
    DETCT_PASSED     //通过
} ENU_DETCT_RESULT;  //检测结果

/**
 * @brief 诊断状态字节
*/
typedef union{
    struct{
        uint8_t TestFailed:1; // 测试失败标志
        uint8_t R1:1;
        uint8_t R2:1;
        uint8_t ConfirmedDTC:1; // 确认失败标志
        uint8_t R4:1;
        uint8_t R5:1;
        uint8_t R6:1; 
        uint8_t R7:1;
    } DTCStatusBit;
    uint8_t ucDTCStatusByte;
} STR_DTC_STATUS;  

/**
 * @brief 诊断配置数据，含链表结构
*/
typedef struct
{
    STR_DTC_STATUS stDTCStatus;          //检测状态
    uint16_t usPeriod;                   //周期
    uint16_t usPassLimit;                //通过次数
    uint16_t usFailedLimit;              //失败次数
    uint16_t  sCounter;                  //故障计数器
    ENU_DETCT_FLAG (*irfDiagFunction)(void);    //故障诊断函数
    void (*irfFaultConfirm)(ENU_DETCT_FLAG);       //故障确认函数

    struct list_head list;            
} STR_DIAG_CFG_NODE;

int32_t DiagInit(void);                                 //初始化
int32_t DiagReset(void);                                //复位
int32_t DiagAddNode(STR_DIAG_CFG_NODE *diagCfgNodePtr); //增加节点
int32_t DiagDltNode(STR_DIAG_CFG_NODE *diagCfgNodePtr);
void DiagMainProcess(void);                             //主进程

#endif // _DIAGNOSTIC_H_
